package core.thread;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 * Clase Mail util para enviar los mail de administracion de lista de la compra
 * maker
 * 
 * @author alvarogarcia
 * 
 */
public class Mail extends Thread {
	private static final int PLAIN_MESSAGE = 0;
	private static final int OK_CANCEL_OPTION = 0;
	Session sesion;
	Transport transporte;
	Properties propiedades;
	MimeMessage mensaje1;
	String destinatario, asunto, mensaje;

	/**
	 * Constructor en vacio de objetos de tipo mail
	 */
	public Mail() {
	}

	public Mail(String destinatario, String asunto, String mensaje) {
		this.destinatario = destinatario;
		this.asunto = asunto;
		this.mensaje = mensaje;
	}

	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	public void run() {
		try {

			Session session = crearSesion();
			// Sacar por pantalla los detalles del envio.
			session.setDebug(true);

			// Construccion del mensaje
			mensaje1 = new MimeMessage(session);
			// Se define la direccion de quien manda el email
			mensaje1.setFrom(new InternetAddress(
					"listadelacompramaker@gmail.com"));
			// Se define el receptor del email. En este caso es tipo TO
			/*
			 * Message.RecipientType.TO Destinatario principal del mensaje
			 * Message.RecipientType.CC Destinatario al que se envía copia del
			 * mensaje Message.RecipientType.BCC Destinatario al que se envía
			 * copia, pero sin que los demás destinatarios puedan verlo.
			 */
			mensaje1.addRecipient(Message.RecipientType.TO,
					new InternetAddress(destinatario));
			// Se define el asunto del email
			mensaje1.setSubject(asunto);
			// Se define el texto del email, en este caso en forma de texto
			// plano.
			mensaje1.setText(mensaje);

			// Lo enviamos.
			Transport t = session.getTransport("smtp");
			// Creamos la conexion con nuestro usuario y contraseña de la cuenta
			t.connect("listadelacompramaker@gmail.com", "laboratorio50");
			// Se manda el mensaje pasando el mensaje que hemos creado antes y
			// pasando un array de receptores que le sacamos del mensaje.
			t.sendMessage(mensaje1, mensaje1.getAllRecipients());

			// Cierre de la sesion.
			t.close();
			
			Icon icono = new ImageIcon("src/GUI/resources/email.png");
			JOptionPane.showOptionDialog(
					null,
					"Se ha envidado un email a la direccion:  "
							+ destinatario, "Mensaje enviado",
					OK_CANCEL_OPTION, PLAIN_MESSAGE, icono,
					new Object[] { "ACEPTAR" }, null);
		} catch (Exception e) {
			Icon icono = new ImageIcon("src/GUI/resources/error.gif");	
				JOptionPane.showOptionDialog(null, "Error en el envio",
						"Error al enviar el email a la direccion : "+destinatario+"\n\n Revise su conexion e intentelo mas adelante", OK_CANCEL_OPTION, PLAIN_MESSAGE, icono,
						new Object[] { "ACEPTAR" }, null);
		}
	}

	/**Metodo para crear la sesion
	 * @return Devuelve una sesion ya creada
	 */
	public Session crearSesion() {
		// Se crean las propiedades de la conexión mediante la clase
		// Properties.
		Properties propiedades = new Properties();
		// Se define el servidor de correo
		propiedades.setProperty("mail.smtp.host", "smtp.gmail.com");
		propiedades.setProperty("mail.smtp.starttls.enable", "true");
		// Se define el puerto que se va a usar
		propiedades.setProperty("mail.smtp.port", "587");
		// Se define la cuenta de correo que vamos a usar
		propiedades.setProperty("mail.smtp.user",
				"listadelacompramaker@gmail.com");
		// Se declara que la cuenta de correo tiene contraseña
		propiedades.setProperty("mail.smtp.auth", "true");

		// Se prepara la sesion con las propiedades que hemos definido
		// antes.
		Session session = Session.getDefaultInstance(propiedades);
		// Sacar por pantalla los detalles del envio.
		return session;
	}

	/**MEtodo para obtener el destinatario
	 * @return El destinatario del email
	 */
	public String getDestinatario() {
		return destinatario;
	}

	/**Metodo para modificar el destinatario
	 * @param destinatario Recibe un destinatario para modificarlo en caso necesario
	 */
	public void setDestinatario(String destinatario) {
		this.destinatario = destinatario;
	}

	/**Metodo para recojer el asunto
	 * @return el asunto del emaiñ
	 */
	public String getAsunto() {
		return asunto;
	}

	/**Setter de asunto
	 * @param asunto Recibe un asunto para modificar la variable asunto.
	 */
	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	/**Getter del mensaje del mail
	 * @return un String con el mensaje del email
	 */
	public String getMensaje() {
		return mensaje;
	}

	/**Setter del mensaje del email
	 * @param mensaje recibe un mensaje como parametro para modificar el atributo de la clase
	 */
	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	/**Pequeño main de prueba para probar el buen funcionamiento del hilo.
	 * @param args
	 */
	public static void main(String[] args) {

		MailAdjunto a = new MailAdjunto(
				"alvaro.garcia@opendeusto.es",
				"PruebaHilo",
				"hallo",
				"/Users/alvarogarcia/Documents/Musica/RockFm 500/Rock FM 500/Rock FM 500/325 Queen - Don't Stop Me Now.mp3",
				"Don`t stop me now.mp3");
		a.arrancarHilo();
		for (double b = 0; b < Double.MAX_VALUE; b++) {
			System.out.println(b);
		}

	}
}
